import axios from 'axios';
import { myApi } from './myApi';

const instance = axios.create({
  baseURL: 'https://ok.wentiertong.com',
  timeout: 3000,
});

const Http: any = {}; // 包裹请求方法的容器

// 对 myApi 进行循环遍历输出不同的请求方法
// 下边会将 请求格式/参数 进行统一为 params，isFormData，config
for (const key of Object.keys(myApi)) {
  const api = myApi[key];  // api包含url method

  // 参数1 --- 请求参数params
  // get请求的话，参数放到URL上
  // post、put、patch请求的话，对应的参数是data
  // delete请求的话，默认放在URL上
  // 参数2 --- isFormData 标识是否是 form-data 请求，默认不是
  // 参数3 --- config 配置参数，可以在这里设置 headers、params、data等

  Http[key] = async  (// 方法接受的参数
    params: any,
    isFormData = false,
    config: any = {},
  ) => {
    // 声明新变量，判断content-type是否是form-data时候的参数的转换
    let newParams: any = {};

    // 判断 content-type 是否是 form-data
    if (params && isFormData) {
      newParams = new FormData();  // 创建一个form-data格式的对象
      for (const i of Object.keys(params)) {
        newParams.append(i, params[i]);
      }
    } else {
      // 不是form-data
      newParams = params;
    }
    // 不同请求的判断
    let response = {};  // 请求的返回值
    if (api.method === 'post' || api.method === 'put' || api.method === 'patch') {
      try {
        response = await instance[api.method](api.url, newParams, config);
      } catch (err) {
        response = err;
      }
    } else if (api.method === 'get' || api.method === 'delete') {
      config.params = newParams;
      try {
        response = await instance[api.method](api.url, config);
      } catch (err) {
        response = err;
      }
    }
    return response;  // 返回响应值
  };
}

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 发起请求前做什么
    return config;
  },
  () => {
    // 请求错误
    return Promise.reject();
  },
);

// 响应拦截器
instance.interceptors.response.use(
  // 响应成功
  (res) => {
    return res.data;
  },
  () => {
    return Promise.reject();
  },
);

export default Http;
